package com.yeren.Reflection.Class;

import java.lang.reflect.Field;

/**
 * 获取字段的四个方法: 
 * 1:getField
 * 	返回一个 Field 对象，它反映此 Class 对象所表示的类或接口的指定公共成员字段。
 * ****************************************************
 * 2:getFields
 * 	返回一个Field对象反射出类或者接口的所有public类型的字段的数组
 * 	如果此 Class没有public类型的字段，则返回长度为0的数组；
 * 	如果此 Class代表一个类，那么这个方法返回该类和其父类的public类型的字段；
 * 	如果此 Class代表一个接口，那么这个方法返回该接口和父接口的所有字段
 * 	如果此 Class代表一个数组类型、原始类型或空，则此方法返回长度为0的数组；
 * 	注：返回数组中的元素没有排序，没有任何特定的顺序。
 * ****************************************************
 * 3:getDeclaredField
 *  返回一个 Field 对象，该对象反映此 Class 对象所表示的类或接口的指定已声明字段（包括私有成员）。
 * ****************************************************
 * 4:getDeclaredFields
 *  返回 Field 对象的一个数组，该数组包含此 Class 对象所表示的类或接口所声明的所有字段（包括私有成员）。
 *  如果此 Class代表一个数组类型、原始类型或空，则此方法返回长度为0的数组；
 *  注：返回数组中的元素没有排序，没有任何特定的顺序。
 * 
 */
public class ClassAPIDemo1 {
	public static void main(String[] args) throws NoSuchFieldException {
		/**
		 * 类
		 */
		Class<SubClass> class1 = SubClass.class;
		Field[] fields = class1.getFields();
		for(Field f:fields){
			System.out.println(f);
		}
		Field field = class1.getField("birthday");
		System.out.println("birthday==>:"+field);
		
		Field declaredField = class1.getDeclaredField("birthday");
		System.out.println("birthday:"+declaredField);
		Field[] declaredFields = class1.getDeclaredFields();
		for(Field f:declaredFields){
			System.out.println(f);
		}
		System.out.println("=========================");
		/**
		 * 接口
		 */
		Class<SubInterface> interface2 = SubInterface.class;
		Field[] fields2 = interface2.getFields();
		for(Field f:fields2){
			System.out.println(f);
		}
		Field field2 = interface2.getField("birthday1");
		System.out.println("birthday1==>:"+field2);
		Field declaredField2 = interface2.getDeclaredField("birthday1");
		System.out.println("birthday1:"+declaredField2);
		Field[] declaredFields2 = interface2.getDeclaredFields();
		for(Field f:declaredFields2){
			System.out.println(f);
		}
	}

}

class SubClass extends SuperClass {
	public String birthday;
	private String age;

	public String getBirthday() {
		return birthday;
	}

	public void setBirthday(String birthday) {
		this.birthday = birthday;
	}

	public String getAge() {
		return age;
	}

	public void setAge(String age) {
		this.age = age;
	}

}

class SuperClass {
	private String id;
	public String country;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getCountry() {
		return country;
	}

	public void setCountry(String country) {
		this.country = country;
	}

}

interface SubInterface extends SuperInterface{
	public String birthday1="birthday123";
}

interface SuperInterface{
	public String id1="id123";
	public String country1="country123";
}


